/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Mezcla;

import Almacenamiento.Atributo;
import Almacenamiento.Convert;
import Almacenamiento.IdentificadorPagina;
import Almacenamiento.IdentificadorTupla;
import Almacenamiento.Pagina;
import Almacenamiento.Relacion;
import Almacenamiento.Tupla;
import com.sun.org.apache.bcel.internal.generic.ARRAYLENGTH;
import com.sun.xml.internal.ws.api.wsdl.parser.MetaDataResolver;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 *
 * @author User
 */
public class Mezcla {
    List<Pagina> Disco ;
   int M;//tamanio del buffer(cuantas paginas pueden caber)
   int nt; //nro de tuplas por disco;
   int np; //numero de paginas en el disco;
   int tt;//nro total de tuplas de  un disco = nt*np
   
    List<Pagina> Buffer;
    List<Pagina> ArchivosSecuencia;
    Relacion relacion;

    public Mezcla(int nt, int np, Relacion relacion, int m) {
        this.nt = nt;
        this.np = np;
        
        this.relacion = relacion;
        M=m;
        Disco= new ArrayList<Pagina>();
        tt= np*nt;
        ArchivosSecuencia = new ArrayList<Pagina>();
        Buffer = new ArrayList<Pagina>();
    }
  
    public void llenarDisco()
    {
        ArrayList Lista= new ArrayList();
        Random R = new Random();
        
        for (int i = 0; i < np; i++) {
            
            Pagina  p = new Pagina(relacion, new IdentificadorPagina("Pagina.txt", i));
            for (int j = 0; j < nt; j++) {
                List<Comparable> valores = new ArrayList<Comparable>();
                int pk=R.nextInt((np*nt)*2);//para controlar no duplicadoss
                while (!Lista.contains(pk)) //para controlar no duplicados
                {
                  valores.add(pk);//pk
                 Lista.add(pk);
                 valores.add(R.nextInt((np*nt)*10));//valor1 
                 p.adicionarTupla(new Tupla(new IdentificadorTupla("Pagina.txt"),valores));
                }
                
               
                
                
            }
            
            Disco.add(p);
        }
        
        
        for (int i = 0; i < Lista.size(); i++) {
            System.out.println(Lista.get(i));
        }
    }
    public void MostrarDisco()
    {
        for (int i = 0; i < np; i++) {
            System.out.println("Pagina: "+ Disco.get(i).toString());
                
            }
    }
    public void MetaDatosDisco()
    {
    
    System.out.println("Datos del Disco: ");
    System.out.println("Tamanio (nro de bloques/paginas): " +np);
    System.out.println("Nro de tuplas por página: "+ nt);
    System.out.println("Tamanio del buffer ( en nro de paginas): "+ M);
     System.out.println("Tamanio de los Archivos de secuencia ( en nro de paginas): "+ M);
    System.out.println("Relacion: "+ relacion);
     System.out.println("Total de tuplas en disco: "+ tt);
    
    
   
    
    }
    public void OrdenarMezcla()
    {
       
    //  1.- copiar todas las paginas que se pueda al buffer
        int ultimo =0;
        for (int i = 0; i < M; i++) {
            Buffer.add(Disco.get(ultimo));
            ultimo++;
        }
        
   //ordenar el buffer
     Tupla[] Aux= new Tupla[M*nt];
     int k=0;
        for (int i = 0; i < M; i++) {
            for (int j = 0; j < nt; j++) {
                Aux[k]=Buffer.get(i).getTuplas().get(j);//insertar la tupla
                k++;
                
            }
            
        }
   //chancar al buffer  
        OrdenarListaTuplas(Aux);
        Buffer.clear();
        
        for (int i = 0; i < M; i++) {
            int h=0;
            Pagina nueva_pagina=null;
            for (int j = 0; j < nt; j++) {
                
                //cnstruir la pagina
                nueva_pagina= new Pagina(relacion, new IdentificadorPagina(null, j));
                nueva_pagina.adicionarTupla(Aux[h]);
                
                h++;
            }
            Buffer.add(nueva_pagina);
            
        }
    
    
    }
    public void EscribirBuffer()
    {
        for (int i = 0; i < M; i++) {
            System.out.println(Buffer.get(i).toString());
        }
    
    }
     public  Tupla[]  OrdenarListaTuplas(Tupla[] A)         
     {
     ArrayList Nuevo = new ArrayList();
         for (int i = 0; i < A.length; i++) {
             Nuevo.add(A[i].getValores().get(i));
         }
     Collections.sort(Nuevo);
     
     //copiar otra vez
     Tupla[] R =new Tupla[A.length];
         for (int i = 0; i < Nuevo.size() ; i++) {
             List<Comparable> valores = new ArrayList<Comparable>();
             
               for (int j = 0; j < A.length; j++) {
                 if (A[j].getValores().get(0) == Nuevo.get(i))                 
                 {
                     
                 }
             }
             Tupla tupla= new Tupla(null,valores);
         }
     return R;
     
     }
       
    public static  void main(String[] args)
    {
        Relacion R= new Relacion();
        List<Atributo> At = new ArrayList<Atributo>();
        At.add(new Atributo("pk_relacion",Integer.class ));
        At.add(new Atributo("valor1",Integer.class ));
        
        R.setAtributos(At);
        Mezcla mexcla = new Mezcla(3, 8, R, 4);
        System.out.println("Disco :");
        mexcla.llenarDisco();
        mexcla.MostrarDisco();
        mexcla.MetaDatosDisco();
        mexcla.OrdenarMezcla();
        mexcla.EscribirBuffer();
        
    
    }
        
    }
    
    
    
    

